package game.util;

import game.componentes.Matriz.Marcou;

import java.util.Random;

import android.graphics.Point;

public class Computador {
	private final Marcou marcou;

	public Computador(Marcou marcou) {
		this.marcou = marcou;
	}

	public void realizarMarcacao(Marc[][] jogo, Marc marcacao) {
		if (!checarPossibilidadeDeVitoria(jogo, marcacao) && !checarVitoriaOponente(jogo, marcacao))
			marcar(jogo, marcacao, false);
	}

	private boolean checarVitoriaOponente(Marc[][] jogo, Marc marcacao) {
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (jogo[i][j] == null) {
					Marc trade = tradeMarc(marcacao);
					jogo[i][j] = trade;
					if (Verificacao.verificar(jogo, trade) != null) {
						jogo[i][j] = null;
						marcou.onMark(new Point(i, j));
						return true;
					} else
						jogo[i][j] = null;
				}
			}
		}
		return false;
	}

	private Marc tradeMarc(Marc marc) {
		if (Marc.X.equals(marc))
			return Marc.O;
		else
			return Marc.X;
	}

	private boolean checarPossibilidadeDeVitoria(Marc[][] jogo, Marc marcacao) {
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (jogo[i][j] == null) {
					jogo[i][j] = marcacao;
					if (Verificacao.verificar(jogo, marcacao) != null) {
						jogo[i][j] = null;
						marcou.onMark(new Point(i, j));
						return true;
					} else
						jogo[i][j] = null;
				}
			}
		}
		return false;
	}

	private void marcar(Marc[][] jogo, Marc marcacao, boolean linearmente) {
		if (linearmente) {
			for (int i = 0; i < 3; i++)
				for (int j = 0; j < 3; j++)
					if (jogo[i][j] == null) {
						marcou.onMark(new Point(i, j));
						return;
					}
		} else {
			Random rdm = new Random();
			int i = 0, j = 0;
			do {
				i = rdm.nextInt(3);
				j = rdm.nextInt(3);
			} while (jogo[i][j] != null);
			marcou.onMark(new Point(i, j));
		}
	}
}
